package syg._01_assignee_listener;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.junit.Test;

/**
 * @author SYG
 */
public class _01_AssigneeListener {

    /**
     * 1,部署流程实例
     */
    @Test
    public void test1() {
        // 1,创建ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 2,获取RepositoryService实例(因为我们要部署流程,部署流程相关的service是RepositoryService)
        RepositoryService repositoryService = processEngine.getRepositoryService();
        // 3,使用RepositoryService进行部署(部署什么呢？自然是部署bpmn文件与png文件呀,其实就是解析bpmn文件,png文件应该就是方便查看的作用,故而截图也是可以的)
        Deployment deployment = repositoryService.createDeployment()
                // 流程的名字
                .name("监听器设置流程负责人")
                // 部署bpmn资源(当然也提供其他部署方式,因为这是单个文件,如果文件很多怎么办？)
                .addClasspathResource("bpmn/assignee_listener.bpmn")
                // 部署png资源(比如使用io流部署,使用bpmn modle部署)
                .addClasspathResource("bpmn/assignee_listener.png")
                // cvc-complex-type.2.4.a: 发现了以元素 'process' 开头的无效内容。  先屏蔽掉这个错误
                .disableSchemaValidation()
                .deploy();

        // 4、输出部署信息(部署完毕,自然可以获取流程的信息)
        System.out.println("流程部署id=" + deployment.getId());
        System.out.println("流程名=" + deployment.getName());
        // 这里获取不到key,流程key与流程定义的key含义不一样吗？
        System.out.println("流程key=" + deployment.getKey());
        System.out.println("流程版本号=" + deployment.getVersion());

    }

    @Test
    public void test2() {
        // 1,获取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 2,获取RuntimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
        // 2,根据流程定义Id启动流程(流程定义的id,是我们在画bpmn文件时指定的key,也可以使用数据生成时的id,有对应的方法),并得到流程实例  = act_re_procdef中的key
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("assignee_listener");

        // 3,输出流程信息
        System.out.println("流程实例名称=" + processInstance.getName());
        System.out.println("流程实例对应的部署id=" + processInstance.getDeploymentId());
        System.out.println("流程实例的id(这个id是表中的id)=" + processInstance.getId());
        System.out.println("流程实例对应的流程id=" + processInstance.getProcessDefinitionId());
        System.out.println("流程实例的id(实例id与字段id一致)=" + processInstance.getProcessInstanceId());
        System.out.println("" + processInstance.getActivityId());
    }
}
